// Datum                                Naam programmeur
//   Beschrijving                         Storynummer
//======================================================
// 26/11/2013                           Leys Thomas (c1026794)
//   getVliegtuigenByZoekCriteria         UC 1.4 S01
// 28/11/2013                           Leys Thomas (c1026794)
//   getAlleVliegtuigModellen &           UC 1.4 S03
//   getAlleVliegtuigTypes toegevoegd

package core.logic.dataAccess;

import java.sql.Connection;

import javax.swing.JOptionPane;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import core.logic.services.utilServices.ConnectionService;
import core.models.domainModel.Eigenaar;
import core.models.domainModel.Vliegtuig;
public class VliegtuigenDAO
{
	public static ArrayList<Vliegtuig> getVliegtuigen() // @Author: Lieven Dreikoningen
	{
		ArrayList<Vliegtuig> v = new ArrayList<Vliegtuig>();
		String sql = "SELECT VliegtuigId, "
				+           "EigenaarId, "
				+           "aantalPilotenNodig, "
				+           "aantalStewardsNodig, "
				+           "aantalZetelsPerRij, "
				+           "aantalRijenBusiness, "
				+           "aantalRijenEcon, "
				+           "Model, "
				+           "Type "
				+    "FROM Vliegtuig";
		try
		{
			Statement statement = ConnectionService.getConnection().createStatement();
			ResultSet rs = statement.executeQuery(sql);
			
			while(rs.next())
			{
				Vliegtuig vl = new Vliegtuig
						(
							rs.getInt("vliegtuigID"), 
							rs.getString("Model"),
							rs.getString("Type"),
							new Eigenaar(rs.getInt("EigenaarId"),"",0,"",null),
							rs.getInt("aantalPilotenNodig"), 
							rs.getInt("aantalStewardsNodig"), 
							rs.getInt("aantalZetelsPerRij"), 
							rs.getInt("aantalRijenBusiness"), 
							rs.getInt("aantalRijenEcon")
						);
				v.add(vl);
			}
		}
		catch(SQLException sqlex)
		{
			sqlex.getStackTrace();			
		}
		return v;
	}
	//Lieven Drijkoningen
	//Geeft een arraylist terug met de vliegtuigen van een bepaalde eigenaar
	//UC 10.1 S02
	public static ArrayList<Vliegtuig> getVliegtuigByEigenaar(Eigenaar e)
	{
		ArrayList<Vliegtuig> listVliegtuigen = new ArrayList<Vliegtuig>();
		String sql = "SELECT VliegtuigId, "
				+           "EigenaarId, "
				+           "aantalPilotenNodig, "
				+           "aantalStewardsNodig, "
				+           "aantalZetelsPerRij, "
				+           "aantalRijenBusiness, "
				+           "aantalRijenEcon, "
				+           "Model, "
				+           "Type "
				+    "FROM Vliegtuig "
				+    "WHERE Vliegtuig.Eigenaarid = ?";
		Connection con;
		ResultSet rs = null;
		PreparedStatement pst = null;
		try
		{
			con = ConnectionService.getConnection();
			pst = con.prepareStatement(sql);
			pst.setInt(1,e.getEigenaarID());
			rs = pst.executeQuery();
			while(rs.next())
			{
				Vliegtuig vl = new Vliegtuig
						(
							rs.getInt("vliegtuigID"), 
							rs.getString("Model"),
							rs.getString("Type"), 
							e,
							rs.getInt("aantalPilotenNodig"), 
							rs.getInt("aantalStewardsNodig"), 
							rs.getInt("aantalZetelsPerRij"), 
							rs.getInt("aantalRijenBusiness"), 
							rs.getInt("aantalRijenEcon")
						);
				listVliegtuigen.add(vl);
			}
		}
		catch(Exception ex)
		{
			JOptionPane.showMessageDialog(null,"oeioei! error!","TITLE",JOptionPane.WARNING_MESSAGE);
		}
		return listVliegtuigen;
		
	}
	
	public static int insertVliegtuig(Vliegtuig ditvliegtuig) 
	{
		String sql = "INSERT INTO Vliegtuig(EigenaarId,aantalPilotenNodig,"
				+ "aantalStewardsNodig, aantalZetelsPerRij, aantalRijenBusiness," 
				+ "aantalRijenEcon, Model, Type) VALUES(?,?,?,?,?,?,?,?)";
		Connection con;
		int ok = 0;
		
		try 
		{
			//Statement statement = ConnectionService.getConnection().createStatement();
			//ResultSet rs = statement.executeQuery(sql);
			
			con = ConnectionService.getConnection();
			PreparedStatement pst = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
			pst.setInt(1, ditvliegtuig.get_eigenaar().getEigenaarID());
			pst.setInt(2, ditvliegtuig.get_aantalPilotenNodig());
			pst.setInt(3, ditvliegtuig.get_aantalStewardsNodig());
			pst.setInt(4, ditvliegtuig.get_aantalZetelsPerRij());
			pst.setInt(5, ditvliegtuig.get_aantalRijenBusiness());
			pst.setInt(6, ditvliegtuig.get_aantalRijenEconomy());
			pst.setString(7, ditvliegtuig.get_model());
			pst.setString(8, ditvliegtuig.get_type());
			
			ok = pst.executeUpdate();
			pst.close();
			
		} 
		catch (Exception exc) 
		{
			JOptionPane.showMessageDialog(null,"oeioei! error!","TITLE",JOptionPane.WARNING_MESSAGE);
			//exc.getStackTrace();
		}
		
		return ok;
	}
	
	public static ArrayList<Vliegtuig> getVliegtuigenByZoekCriteria(int vliegtuigNummer, Eigenaar eigenaar, String model, String type) {
		ArrayList<Vliegtuig> lijstVliegtuigen = new ArrayList<Vliegtuig>();
		int aantalParameters = 0;
		String sql = "SELECT * "
				   + "FROM Vliegtuig ";
		if (vliegtuigNummer > 0 || eigenaar.getEigenaarID() != -1 || model != "Selecteer model" || type != "Selecteer type") {
			sql += "WHERE ";
		}
		
		if (vliegtuigNummer > 0) {
			sql += "VliegtuigId = ? AND ";
		}
		
		if (eigenaar.getEigenaarID() != -1) {
			sql += "EigenaarId = ? AND ";
		}
		
		if (model != "Selecteer model") {
			sql += "Model = ? AND ";
		}
		
		if (type != "Selecteer type") {
			sql += "Type = ? AND ";
		}
		
		if (vliegtuigNummer > 0 || eigenaar.getEigenaarID() != -1 || model != "Selecteer model" || type != "Selecteer type") {
			int lengteString = sql.length();
			sql = sql.substring(0, lengteString-5);
		}
		
		try {
			PreparedStatement statement = ConnectionService.getConnection().prepareStatement(sql);
			if (vliegtuigNummer > 0) { 
				aantalParameters ++;
				statement.setInt(aantalParameters, vliegtuigNummer);
			}
			
			if (eigenaar.getEigenaarID() != -1) {
				aantalParameters ++;
				statement.setInt(aantalParameters, eigenaar.getEigenaarID());
			}
			
			if (model != "Selecteer model") {
				aantalParameters ++;
				statement.setString(aantalParameters, model);
			}
			
			if (type != "Selecteer type") {
				aantalParameters ++;
				statement.setString(aantalParameters, type);
			}
			
			ResultSet resultSet = statement.executeQuery();
			while(resultSet.next()) {
				Vliegtuig nieuwVliegtuig = new Vliegtuig(
						resultSet.getInt("vliegtuigID"), 
						resultSet.getString("Model"),
						resultSet.getString("Type"), 
						new Eigenaar(resultSet.getInt("EigenaarId"),"",0,"",null),
						resultSet.getInt("aantalPilotenNodig"), 
						resultSet.getInt("aantalStewardsNodig"), 
						resultSet.getInt("aantalZetelsPerRij"), 
						resultSet.getInt("aantalRijenBusiness"), 
						resultSet.getInt("aantalRijenEcon")
						);
				lijstVliegtuigen.add(nieuwVliegtuig);
			}
			
		} catch(SQLException ex) {
			ex.printStackTrace();
		}
		
		return lijstVliegtuigen;
	}
	
	public static ArrayList<String> getAlleVliegtuigModellen() {
		ArrayList<String> vliegtuigModellen = new ArrayList<String>();
		
		String sql = "SELECT DISTINCT Model "
				+    "FROM Vliegtuig";
		try
		{
			Statement statement = ConnectionService.getConnection().createStatement();
			ResultSet resultSet = statement.executeQuery(sql);
			
			while(resultSet.next())
			{
				vliegtuigModellen.add(resultSet.getString("Model"));
			}
		}
		catch(SQLException ex)
		{
			ex.getStackTrace();			
		}
		
		return vliegtuigModellen;
	}
	
	public static ArrayList<String> getAlleVliegtuigTypes() {
		ArrayList<String> vliegtuigTypes = new ArrayList<String>();
		
		String sql = "SELECT DISTINCT Type "
				+    "FROM Vliegtuig";
		try
		{
			Statement statement = ConnectionService.getConnection().createStatement();
			ResultSet resultSet = statement.executeQuery(sql);
			
			while(resultSet.next())
			{
				vliegtuigTypes.add(resultSet.getString("Type"));
			}
		}
		catch(SQLException ex)
		{
			ex.getStackTrace();			
		}
		
		return vliegtuigTypes;
	}
	
	public static int UpdateVliegtuig(Vliegtuig vl)
	{
		String sql = "UPDATE Vliegtuig "
				+ "SET aantalPilotenNodig = ?, aantalStewardsNodig = ?, aantalZetelsPerRij = ?, aantalRijenBusiness = ?, aantalRijenEcon = ?, model = ?, type = ? "
				+ "WHERE VliegtuigId = ?";
				
		Connection con;
		int ok = 0;
		
		try 
		{
			
			con = ConnectionService.getConnection();
			PreparedStatement pst = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
			int i = 1;
			pst.setInt(i++, vl.get_aantalPilotenNodig());
			pst.setInt(i++, vl.get_aantalStewardsNodig());
			pst.setInt(i++, vl.get_aantalZetelsPerRij());
			pst.setInt(i++, vl.get_aantalRijenBusiness());
			pst.setInt(i++, vl.get_aantalRijenEconomy());
			pst.setString(i++, vl.get_model());
			pst.setString(i++, vl.get_type());
			pst.setInt(i++, vl.get_vliegtuigID());
			
			ok = pst.executeUpdate();
			pst.close();
			
			
		} 
		catch (Exception exc) 
		{
			JOptionPane.showMessageDialog(null,"fout","TITLE",JOptionPane.WARNING_MESSAGE);
			//exc.getStackTrace();
		}
		
		return ok;
	}
}
